﻿using System;
using System.Text;
using System.Web;
using MiWebSite_Core;
using WLMCoreLibrary;

namespace MWS_Main.Handlers
{
    public partial class MenuHandler : System.Web.UI.Page
    {
        protected void Page_Load( object sender, EventArgs e )
        {
            Response.ContentType = "text/plain";

            //if (context.Session["nivelUsuario"]!=null)
            //    if (Convert.ToInt32(context.Session["nivelUsuario"]) > 5)
            {
                WebSiteMainConfiguration config = WebSiteMainConfiguration.GetConfig();
                dbConnector ConexionDB = new dbConnector( config.Connections[0].value );
                if ( Request.QueryString["idOpcionPadre"] != null )
                {
                    int idOpcionPadre;

                    if ( WLMFunctions.TryParseToInt( Request.QueryString["idOpcionPadre"].ToString(), out idOpcionPadre ) )
                        idOpcionPadre = Convert.ToInt32( Request.QueryString["idOpcionPadre"] );
                    else
                        idOpcionPadre = MiWebSiteFunctions.BuscarRegistro( "categorias", "nombre", "Mapa del Sitio", ref ConexionDB );
                    string nombreOpcion = Request.QueryString["nombreOpcion"];
                    string urlOpcion = "";
                    if ( Request.QueryString["urlOpcion"] != null )
                        urlOpcion = Request.QueryString["urlOpcion"];
                    int ordenOpcion = Convert.ToInt32( Request.QueryString["ordenOpcion"] );

                    Response.Write( NuevaOpcionMenu( idOpcionPadre, nombreOpcion, urlOpcion, ordenOpcion, ref ConexionDB ) );
                    LimpiarCacheMenu( HttpContext.Current );
                }

                if ( Request.QueryString["cargarMenu"] != null )
                {
                    //Response.Write(MiWebSiteFunctions.CrearMenuSuperior(MiWebSiteFunctions.BuscarRegistro("categorias", "nombre", "mapa del sitio",ref conexion), 0, "", "",ref conexion));
                    Categoria menuPrincipal = new Categoria( 1, "", ref ConexionDB );
                    string menu = WLMFunctions.TransformXML( menuPrincipal, config.Settings["siteURL"].value + "xsl/includes/menu.xsl" );
                    menu = menu.Substring( 2 );
                    Response.Write( menu );
                    ConexionDB.CloseConnection();
                    Response.End();
                }

                if ( Request.QueryString["idOpcion"] != null )
                {
                    int idOpcion = Convert.ToInt32( Request.QueryString["idOpcion"] );
                    string nombreOpcion = Request.QueryString["nombreOpcion"];
                    string urlOpcion = "";
                    if ( Request.QueryString["urlOpcion"] != null )
                        urlOpcion = Request.QueryString["urlOpcion"];
                    int ordenOpcion = Convert.ToInt32( Request.QueryString["ordenOpcion"] );
                    LimpiarCacheMenu( HttpContext.Current );
                    Response.Write( EditarOpcionMenu( idOpcion, nombreOpcion, urlOpcion, ordenOpcion, ref ConexionDB ) );
                }

                if ( Request.QueryString["idOpcionBorrar"] != null )
                {
                    int idOpcion = Convert.ToInt32( Request.QueryString["idOpcionBorrar"] );
                    LimpiarCacheMenu( HttpContext.Current );
                    Response.Write( BorrarOpcionMenu( idOpcion, ConexionDB ) );
                }
                ConexionDB.CloseConnection();
            }
        }

        public void LimpiarCacheMenu( HttpContext context )
        {
            context.Application.Remove( "MenuPrincipal" );
            context.Application.Remove( "MenuInferior" );
            context.Application.Remove( "MenuLateral1" );
            context.Application.Remove( "MenuLateral2" );
            context.Application.Remove( "MenuLateral3" );
            context.Application.Remove( "MenuLateral4" );
        }

        public string BorrarOpcionMenu( int idNodo, dbConnector ConexionDB )
        {
            Categoria opcionMenu = new Categoria( idNodo, ref ConexionDB );
            opcionMenu.Delete();
            opcionMenu.Dispose();

            return "Elemento Borrado";
        }

        public string EditarOpcionMenu( int idNodo, string nombreOpcion, string urlOpcion, int OrdenOpcion, ref dbConnector ConexionDB )
        {
            Categoria opcionMenu = new Categoria( idNodo, ref ConexionDB );
            string urlRuta = LineaMenu( opcionMenu.idPadre, ref ConexionDB );
            ActualizarContenidos( urlRuta, opcionMenu.nombre, nombreOpcion, ref ConexionDB );
            opcionMenu.nombre = nombreOpcion.Trim().Replace( "_", " " );
            if ( urlOpcion == "" )
                opcionMenu.URLLink = urlOpcion;
            else
                opcionMenu.URLLink = "";
            opcionMenu.orden = OrdenOpcion;
            opcionMenu.Save();
            return "nodo " + idNodo + " editado";
        }

        public string NuevaOpcionMenu( int idNodoPadre, string nombreOpcion, string urlOpcion, int ordenOpcion, ref dbConnector ConexionDB )
        {
            Categoria opcionMenu = new Categoria( true, ref ConexionDB );
            opcionMenu.nombre = nombreOpcion.Trim().Replace( "_", " " );
            opcionMenu.idPadre = idNodoPadre;
            opcionMenu.orden = ordenOpcion;
            opcionMenu.URLLink = "";
            string salida = opcionMenu.id.ToString();

            opcionMenu.Save();
            if ( urlOpcion == "" )
                urlOpcion = LineaMenu( opcionMenu.id, ref ConexionDB );
            opcionMenu.URLLink = urlOpcion;
            opcionMenu.Save();

            return salida;
        }

        private string LineaMenu( int idOpcionMenu, ref dbConnector ConexionDB )
        {
            Categoria item = new Categoria( idOpcionMenu, "", ref ConexionDB );
            if ( item.idPadre != 0 )
            {
                return LineaMenu( item.idPadre, ref ConexionDB ) + "/" + MiWebSiteFunctions.tituloaPostName( item.nombre );
            }
            item.Dispose();
            item = null;
            return "";
        }

        protected void ActualizarContenidos( string RutaMenu, string NombreAnterior, string NombreNuevo, ref dbConnector ConexionDB )
        {
            StringBuilder rutaNueva = new StringBuilder();
            StringBuilder rutaAnterior = new StringBuilder();

            //int x = 0;
            //separando la ruta actual del menu
            string[] arreglo = RutaMenu.Split( '/' );

            rutaNueva.Append( RutaMenu );
            rutaAnterior.Append( RutaMenu );

            //moviendose por el arreglo de opciones del menu
            //foreach (string item in arreglo)
            //{
            //    //saltando la opcion raiz de "mapa del sitio"
            //    if (x != 0)
            //    {
            //        if (x < arreglo.Length - 1)
            //        {
            //            rutaNueva.Append(WLMFunctions.tituloaPostName(new MiWebSiteMenuItem(Convert.ToInt32(item),ref ConexionDB).nombre));
            //            rutaAnterior.Append(WLMFunctions.tituloaPostName(new MiWebSiteMenuItem(Convert.ToInt32(item),ref ConexionDB).nombre));
            //        }
            //        if (x < arreglo.Length - 2)
            //        {
            //            rutaNueva.Append("/");
            //            rutaAnterior.Append("/");
            //        }
            //    }

            //    x++;
            //}

            rutaAnterior.Append( "/" + MiWebSiteFunctions.tituloaPostName( NombreAnterior ) );
            rutaNueva.Append( "/" + MiWebSiteFunctions.tituloaPostName( NombreNuevo ) );

            string stringCommand = "UPDATE CONTENIDO SET ContentName=REPLACE(ContentName,'" + rutaAnterior.ToString() + "','" + rutaNueva.ToString() + "') WHERE ContentName LIKE '%" + rutaAnterior.ToString() + "%'";

            ConexionDB.ExecuteCommand( stringCommand );
        }
    }
}